import matplotlib.pyplot as plt
import numpy as np

def observe_exponential_decay():
    """
    观察0.99的n次方数据结果变化
    """
    # 设置n的范围
    n_values = list(range(0, 1001, 50))  # 从0到1000，每50取一个点
    
    # 计算0.99的n次方
    results = []
    for n in n_values:
        result = 0.99 ** n
        results.append(result)
        print(f"0.99^{n:3d} = {result:.10f}")
    
    return n_values, results

def detailed_analysis():
    """
    详细分析关键点的数值
    """
    print("\n" + "="*50)
    print("详细分析关键点")
    print("="*50)
    
    key_points = [1, 10, 50, 100, 200, 300, 400, 500, 600, 700, 800, 900, 1000]
    
    for n in key_points:
        result = 0.99 ** n
        print(f"0.99^{n:3d} = {result:.10f} (约等于 {result:.2e})")
def plot_results(n_values, results):
    """
    绘制结果图表
    """
    plt.figure(figsize=(12, 8))
    
    # 线性坐标图
    plt.subplot(2, 2, 1)
    plt.plot(n_values, results, 'b-', linewidth=2, marker='o', markersize=4)
    plt.xlabel('n')
    plt.ylabel('0.99^n')
    plt.title('Exponential Decay of 0.99^n (Linear Scale)')
    plt.grid(True, alpha=0.3)
    
    # 半对数坐标图（y轴对数）
    plt.subplot(2, 2, 2)
    plt.semilogy(n_values, results, 'r-', linewidth=2, marker='s', markersize=4)
    plt.xlabel('n')
    plt.ylabel('0.99^n (Log Scale)')
    plt.title('Exponential Decay of 0.99^n (Semi-log Scale)')
    plt.grid(True, alpha=0.3)
    
    # 双对数坐标图
    plt.subplot(2, 2, 3)
    plt.loglog(n_values, results, 'g-', linewidth=2, marker='^', markersize=4)
    plt.xlabel('n (Log Scale)')
    plt.ylabel('0.99^n (Log Scale)')
    plt.title('Exponential Decay of 0.99^n (Log-log Scale)')
    plt.grid(True, alpha=0.3)
    
    # 前100个点的详细视图
    plt.subplot(2, 2, 4)
    n_detailed = list(range(0, 101))
    results_detailed = [0.99 ** n for n in n_detailed]
    plt.plot(n_detailed, results_detailed, 'purple', linewidth=2)
    plt.xlabel('n (0-100)')
    plt.ylabel('0.99^n')
    plt.title('Detailed View for First 100 Exponents')
    plt.grid(True, alpha=0.3)
    
    plt.tight_layout()
    
    # 保存图片
    plt.savefig('0.99_power_analysis.png')
    print("图表已保存为 0.99_power_analysis.png")
    plt.close()  # 关闭图形，释放内存

def find_half_life():
    """
    计算"半衰期" - 数值减半所需的n值
    """
    print("\n" + "="*50)
    print("衰减分析")
    print("="*50)
    
    target_values = [0.5, 0.1, 0.01, 0.001, 1e-6, 1e-9]
    
    for target in target_values:
        # 使用对数求解：0.99^n = target => n = log(target) / log(0.99)
        n_required = np.log(target) / np.log(0.99)
        print(f"衰减到 {target:.1e} 需要 n ≈ {n_required:.1f}")

def mathematical_insights():
    """
    提供数学洞察
    """
    print("\n" + "="*50)
    print("数学洞察")
    print("="*50)
    
    # 计算极限
    print("数学性质：")
    print("1. 当 n→∞ 时，0.99^n → 0")
    print("2. 这是一个指数衰减函数")
    
    # 计算衰减率
    decay_rate = 1 - 0.99
    print(f"3. 每次乘方衰减约 {decay_rate:.1%}")
    
    # 计算连续形式
    print("4. 0.99^n 可以写成 e^(n * ln(0.99)) ≈ e^(-0.01005n)")
    print("5. 这类似于放射性衰变或复利的逆过程")

if __name__ == "__main__":
    print("观察0.99的n次方数据结果变化")
    print("="*50)
    
    # 基本观察
    n_values, results = observe_exponential_decay()
    
    # 详细分析
    detailed_analysis()
    
    # 衰减分析
    find_half_life()
    
    # 数学洞察
    mathematical_insights()
    
    # 绘制图表
    plot_results(n_values, results)
    
    # 额外：交互式探索
    print("\n" + "="*50)
    print("交互式探索 指数衰减（输入底数及n次衰变值查看结果，输入q退出）")
    print("="*50)
    
    while True:
        user_input = input("请输入参数，以,隔开 （例如 0.99,10）： ")
        if user_input.lower() == 'q':
            break
        try:
            parts = user_input.replace(',', ' ').split()
            x = float(parts[0])
            n = int(parts[1])

            result = x ** n
            print(f"{x}^{n} = {result:.10f}")
            print(f"科学计数法: {result:.2e}")
            print(f"约等于: {result}")
        except ValueError:
            print("请输入有效的数字或输入q退出")